Brain Linux サウンドドライバ実装(SH2まで)
SAIF0で音を出し、SAIF1で録音
I2C0 の 0x3A にYAMAHAのYMU818Bがいる
I²C ダンプ
<Write reg> → <Read reg> の順番
起動時
$ \ t=0\,\mathrm{[ms]}
0x85 → 0x68
$ \ t=4.76\,\mathrm{[ms]}
0x97 0x47 0x01
0x86 0x1e 0x62
0x80 0x3e
0x80 0x1e
$ \ t=8.1\,\mathrm{[ms]}
0x80 0x1c 0x18 0x00 0x80 0x00
0x22 0x81 0x00 0x40 0x00 0x7f 0xff ...
0x61 0x81 0xe1 0x46 0x19 0x0e 0xbe ...
0x73 0x81 0e2 0xfc 0x12
0x79 0x81 0x0d 0x61 0x40
0x7f 0x81 0x1d 0x03 0xef
0x05 0x82 0xf2 0x51 0xdf
0x11 0x82 0xee 0xf2 0x2a 0x84 0xb5 ...
0x80 0x18 0x1c
0xad 0x22
0x80 0x18
0xac 0x02
0x80 0x10
0x22 0x81 0x04 0x10 0x00 0x10 0x00 0x00 ...
0x40 0x81 0x0d 0x68 0x66 0xf8 0x8b 0x84 ...
0x80 0x18
0x80 0x1c
0x80 0x18
0x80 0x1e
0x92 → 0x00
0x93 → 0x00
0x80 0x18
0x80 0x3e
0x92 → 0x00
0x93 → 0x00
0x80 0x18
0x80 0x3f
動画再生開始時
$ \ t=0\,\mathrm{[ms]}
0x92 → 0x00
0x93 → 0x00
0x80 0x3E
0x80 0x1E
$ \ t=3.17\,\mathrm{[ms]}
0x80 0x1C 0x18
0x80 0x3E
$ \ t=6.4\,\mathrm{[ms]}
0x92 → 0x00
0x93 → 0x00
0x80 0x18
0x80 0x1E
$ \ t=10.4\,\mathrm{[ms]}
0x92 → 0x00
0x93 → 0x00
0x80 0x18
0x80 0x1C
0x80 0x18
0x80 0x10
0x81 0xFE
0x84 0x0B
$ \ t=28.04\,\mathrm{[ms]}
0xAE → 0x01
0x3D 0x81 0x03
0x3D 0x81 0x01
0x82 0x7F
0x88 0x0A 0x00
0x0B 0x81 0x1F
0x10 0x81 0x1F
0x15 0x81 0x1F 0x00 0x04
0xCA 0x40
0x00 0x81 0xCF 0x4F 0xFC 0x7C 0x00 0x4F ...
0xDE 0x01
0x20 0x81 0x01
0x29 0x82 0x01
0x17 0x81 0x00
0x16 0x81 → 0x01
0x16 0x81 → 0x01
...
0x16 0x81 → 0x00
0x20 0x81 0x00 0x02
0x21 0x81 0x00
0x29 0x82 0x00
0x22 0x81 0x04 0x10 0x00 0x10 0x00 ...
0x29 0x81 0x01
0x20 0x81 0x01
0x17 0x81 0x04
0x81 0xFC
0x81 0xF4
0xC9 0x40
0xA5 0x33
動画再生終了時
$ \ t=0\,\mathrm{[ms]}
0xA5 0x20
0x92 → 0x08
0x92 → 0x08
0x92 → 0x08
0x92 → 0x08
0x92 → 0x00
0x93 → 0x00
0x81 0xFE
0xC9 0x00
$ \ t=32.9\,\mathrm{[ms]}
0x17 0x81 0x00
0x16 0x81 → 0x01
...
0x16 0x81 → 0x00
0x20 0x81 0x00 0x02
0x21 0x81 0x00
0x29 0x82 0x00
0xDE 0x00
0x21 0x81 0x02
0x21 0x81 0x00
0x00 0x81 0x80 0x00 0x80 0x00 0x00 ...
0x88 0x0F 0xE0
0x0B 0x81 0x00
0x10 0x81 0x00
0x15 0x81 0x00
0xCA 0x00
0x82 0xFF
0x3D 0x81 0x03
0x3D 0x81 0x02
0x84 0x0F
0x81 0xFF
$ \ t=69.4\,\mathrm{[ms]}
0x80 0x18
0x80 0x1C
0x80 0x18
0x80 0x1E
0x92 → 0x00
0x93 → 0x00
0x80 0x18
0x80 0x3E
0x92 → 0x00
0x93 → 0x00
0x80 0x18
0x80 0x3F
音量
音量1 → 音量0
0xA5 0x20
0x92 → 0x08
0x92 → 0x00
0x93 → 0x00
0x81 0xFE
0xC9 0x00
音量0 → 音量1
0x81 0xFC
0x81 0xF4
0xC9 0x40
0xA5 0x22
音量2: 0xA5 0x28
音量3: 0xA5 0x2C
音量4: 0xA5 0x30
音量5: 0xA5 0x33
音量6: 0xA5 0x35
音量7: 0xA5 0x37
音量8: 0xA5 0x39
音量9: 0xA5 0x3B
I²C ドライバ解析
コマンド <コマンド> <データ> (<>はoptional) の形式?
コマンドが0x80より大きい場合コマンドが下位7bitと残りのbitの2バイトに分かれて転送される
コマンドは必ず0x80がORされた状態で転送される(コマンドとデータの分離用?)
CE I2S クロック 実測
48 kHz
MCLK 22.5804 MHz
BCLK m
MCLK 22.5804 MHz (BCLK x 16)
BCLK 1.41128 MHz (LRCLK x 2 x 16)
LRCLK 44.1 kHz
要件
i2c_driver 実装
バスにこういうデバイスがぶらさがってるよってやつ、割と概念のみ
参考: /drivers/mfd/wm8350-i2c.c
参考: /sound/soc/codecs/adau1781-i2c.c
codec 実装
PCMをデコードして波にする人
/sound/soc/codecs/sgtl5000.c
I2Cで通信をガッツリやる
card 実装
devm_snd_soc_register_card でサウンドカードを登録するのがゴール
DTでいう /sound がカード
/sound/soc/mxs/mxs-sgtl5000.c が参考になる
参考